Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

androidApp/src/google/kotlin/org/meshtastic/app/map/MapViewModel.kt 01cd54907d62cd90913d3d071b6bc240cae365ef (01cd5490) Text, 21.02 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.app.map

Tff7b72import T7ee787android.app.Application
Tff7b72import T7ee787android.net.Uri
Tff7b72import T7ee787androidx.core.net.toFile
Tff7b72import T7ee787androidx.lifecycle.SavedStateHandle
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787com.google.android.gms.maps.model.CameraPosition
Tff7b72import T7ee787com.google.android.gms.maps.model.LatLng
Tff7b72import T7ee787com.google.android.gms.maps.model.TileProvider
Tff7b72import T7ee787com.google.android.gms.maps.model.UrlTileProvider
Tff7b72import T7ee787com.google.maps.android.compose.CameraPositionState
Tff7b72import T7ee787com.google.maps.android.compose.MapType
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableSharedFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.first
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787org.koin.core.annotation.KoinViewModel
Tff7b72import T7ee787org.meshtastic.app.map.model.CustomTileProviderConfig
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleCameraPosition
Tff7b72import T7ee787org.meshtastic.app.map.prefs.map.GoogleMapsPrefs
Tff7b72import T7ee787org.meshtastic.app.map.repository.CustomTileProviderRepository
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.repository.MapPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NotificationPrefs
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioConfigRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioController
Tff7b72import T7ee787org.meshtastic.core.repository.UiPrefs
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.feature.map.BaseMapViewModel
Tff7b72import T7ee787java.io.File
Tff7b72import T7ee787java.io.FileOutputStream
Tff7b72import T7ee787java.io.IOException
Tff7b72import T7ee787java.io.InputStream
Tff7b72import T7ee787java.net.MalformedURLException
Tff7b72import T7ee787java.net.URL
Tff7b72import T7ee787kotlin.uuid.Uuid

Tff7b72private Tff7b72const Tff7b72val Te6edf3TILE_SIZE Tff7b72= T79c0ff2T79c0ff5T79c0ff6

Tff7b72enum Tff7b72class T56d364CameraInitialization Tb4b4b4{
Te6edf3LoadingTb4b4b4,
Te6edf3FitNodesTb4b4b4,
Te6edf3RestoredTb4b4b4,
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@KoinViewModel
Tff7b72class T56d364MapViewModelTb4b4b4(
Tff7b72private Tff7b72val Te6edf3applicationTb4b4b4: Te6edf3ApplicationTb4b4b4,
Tff7b72private Tff7b72val Te6edf3dispatchersTb4b4b4: Te6edf3CoroutineDispatchersTb4b4b4,
Tff7b72private Tff7b72val Te6edf3mapLayersManagerTb4b4b4: Te6edf3MapLayersManagerTb4b4b4,
Te6edf3mapPrefsTb4b4b4: Te6edf3MapPrefsTb4b4b4,
Tff7b72private Tff7b72val Te6edf3googleMapsPrefsTb4b4b4: Te6edf3GoogleMapsPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepositoryTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4: Te6edf3RadioConfigRepositoryTb4b4b4,
Te6edf3radioControllerTb4b4b4: Te6edf3RadioControllerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3customTileProviderRepositoryTb4b4b4: Te6edf3CustomTileProviderRepositoryTb4b4b4,
Te6edf3uiPrefsTb4b4b4: Te6edf3UiPrefsTb4b4b4,
Te6edf3notificationPrefsTb4b4b4: Te6edf3NotificationPrefsTb4b4b4,
Te6edf3savedStateHandleTb4b4b4: Te6edf3SavedStateHandleTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3BaseMapViewModelTb4b4b4(
Te6edf3mapPrefsTb4b4b4,
Te6edf3nodeRepositoryTb4b4b4,
Te6edf3packetRepositoryTb4b4b4,
Te6edf3radioControllerTb4b4b4,
Te6edf3radioConfigRepositoryTb4b4b4,
Te6edf3notificationPrefsTb4b4b4,
Tb4b4b4) Tb4b4b4{

Tff7b72private Tff7b72val Te6edf3_selectedWaypointId Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657IntTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffwaypointIdTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3selectedWaypointIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657Int?Tff7b72> Tff7b72= Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

T8b949e// Site Planner deep link from node detail: MapRoute.Map(sitePlannerNodeNum) → resolve to the node so the map can
T8b949e// open the estimate dialog pre-filled with its position. Cleared once consumed so it doesn't re-open.
Tff7b72private Tff7b72val Te6edf3pendingSitePlannerNodeNum Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3savedStateHandleTb4b4b4.Te6edf3getTff7b72<Tffa657IntTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffsitePlannerNodeNumTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3sitePlannerRequestTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72> Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3pendingSitePlannerNodeNumTb4b4b4, Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4) Tb4b4b4{ Te6edf3numTb4b4b4, Te6edf3db Tff7b72-Tff7b72> Te6edf3numTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3dbTff7b72[Tffa657itTff7b72] Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Tff7b72nullTb4b4b4)

Tff7b72fun Td2a8ffconsumeSitePlannerRequestTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3pendingSitePlannerNodeNumTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72fun Td2a8ffsetWaypointIdTb4b4b4(Te6edf3idTb4b4b4: Tffa657Int?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedWaypointIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3id
Tff7b72if Tb4b4b4(Te6edf3id Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3idTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3idTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72= Te6edf3LatLngTb4b4b4(Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4, Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, T79c0ff1T79c0ff5fTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3cameraPositionState Tff7b72= Te6edf3CameraPositionStateTb4b4b4(Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3LatLngTb4b4b4(T79c0ff0.0Tb4b4b4, T79c0ff0.0Tb4b4b4)Tb4b4b4, T79c0ff7fTb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_cameraInitialization Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3CameraInitializationTb4b4b4.Te6edf3LoadingTb4b4b4)
Tff7b72val Te6edf3cameraInitializationTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3CameraInitializationTff7b72> Tff7b72= Te6edf3_cameraInitializationTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3themeTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3uiPrefsTb4b4b4.Te6edf3theme

Tff7b72private Tff7b72val Te6edf3_errorFlow Tff7b72= Te6edf3MutableSharedFlowTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3errorFlowTb4b4b4: Te6edf3FlowTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3_errorFlowTb4b4b4.Te6edf3asFlowTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3customTileProviderConfigsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3CustomTileProviderConfigTff7b72>Tff7b72> Tff7b72=
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedCustomTileProviderUrl Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3selectedCustomTileProviderUrlTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72> Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_selectedGoogleMapType Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4)
Tff7b72val Te6edf3selectedGoogleMapTypeTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTypeTff7b72> Tff7b72= Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffaddCustomTileProviderTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4, Te6edf3localUriTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffCustom tile provider with name 'Tffd700$Te6edf3nameTa5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Tff7b72var Te6edf3finalLocalUri Tff7b72= Te6edf3localUri
Tff7b72if Tb4b4b4(Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3extension Tff7b72= Ta5d6ff"Ta5d6ffmbtilesTa5d6ff"
Tff7b72val Te6edf3finalFileName Tff7b72= Ta5d6ff"Ta5d6ffmbtiles_Tffd700${Te6edf3UuidTb4b4b4.Te6edf3randomTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff.Tffd700$Te6edf3extensionTa5d6ff"
Tff7b72val Te6edf3copiedUri Tff7b72= Te6edf3copyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3finalFileNameTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3copiedUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3finalLocalUri Tff7b72= Te6edf3copiedUriTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffFailed to copy MBTiles file to internal storage.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError processing local URITa5d6ff" Tb4b4b4}
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffError processing local URI for MBTiles.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3newConfig Tff7b72= Te6edf3CustomTileProviderConfigTb4b4b4(Te6edf3name Tff7b72= Te6edf3nameTb4b4b4, Te6edf3urlTemplate Tff7b72= Te6edf3urlTemplateTb4b4b4, Te6edf3localUri Tff7b72= Te6edf3finalLocalUriTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3addCustomTileProviderTb4b4b4(Te6edf3newConfigTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffupdateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4: Te6edf3CustomTileProviderConfigTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3configToUpdateTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3localUri Tff7b72=Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffInvalid name, URL template, or local URI for updating custom tile provider.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}
Tff7b72val Te6edf3existingConfigs Tff7b72= Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(
Te6edf3existingConfigsTb4b4b4.Te6edf3any Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3id Tff7b72!Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3id Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Tb4b4b4) Tb4b4b4{
Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Ta5d6ff"Ta5d6ffAnother custom tile provider with name 'Tffd700${Te6edf3configToUpdateTb4b4b4.Te6edf3nameTffd700}Ta5d6ff' already exists.Ta5d6ff"Tb4b4b4)
Tff7b72returnTf0883e@launch
Tb4b4b4}

Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3updateCustomTileProviderTb4b4b4(Te6edf3configToUpdateTb4b4b4)

Tff7b72val Te6edf3originalConfig Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4)
Tff7b72if Tb4b4b4(
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72&
Te6edf3originalConfigTff7b72?.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value
Tb4b4b4) Tb4b4b4{
T8b949e// No change needed if URL didn't change, or handle if it did
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3originalConfig Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3originalConfigTb4b4b4.Te6edf3urlTemplateTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3currentlySelectedConfig Tff7b72=
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3currentlySelectedConfigTff7b72?.Te6edf3id Tff7b72=Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3configToUpdateTb4b4b4.Te6edf3urlTemplate
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffremoveCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3configToRemove Tff7b72= Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProviderByIdTb4b4b4(Te6edf3configIdTb4b4b4)
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3deleteCustomTileProviderTb4b4b4(Te6edf3configIdTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3configToRemove Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configToRemoveTb4b4b4.Te6edf3urlTemplate Tff7b72|Tff7b72|
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3configToRemoveTb4b4b4.Te6edf3localUri
Tb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
T8b949e// Also clear from prefs
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUri Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3configToRemoveTb4b4b4.Te6edf3localUriTb4b4b4)
Te6edf3deleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffselectCustomTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3configTb4b4b4.Te6edf3isLocal Tff7b72&Tff7b72& Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3configTb4b4b4.Te6edf3urlTemplateTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3wTb4b4b4(Ta5d6ff"Ta5d6ffAttempted to select invalid URL template: Tffd700${Te6edf3configTb4b4b4.Te6edf3urlTemplateTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72return
Tb4b4b4}
T8b949e// Use localUri if present, otherwise urlTemplate
Tff7b72val Te6edf3selectedUrl Tff7b72= Te6edf3configTb4b4b4.Te6edf3localUri Tff7b72?: Te6edf3configTb4b4b4.Te6edf3urlTemplate
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3selectedUrl
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NONE
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Te6edf3selectedUrlTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsetSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4: Te6edf3MapTypeTb4b4b4) Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3mapType
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Tff7b72null T8b949e// Clear custom selection
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Te6edf3mapTypeTb4b4b4.Te6edf3nameTb4b4b4)
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72var Te6edf3currentTileProviderTb4b4b4: Te6edf3TileProvider? Tff7b72= Tff7b72null

Tff7b72fun Td2a8ffgetTileProviderTb4b4b4(Te6edf3configTb4b4b4: Te6edf3CustomTileProviderConfig?Tb4b4b4)Tb4b4b4: Te6edf3TileProvider? Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3config Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Te6edf3currentTileProvider Tff7b72= Tff7b72null
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72val Te6edf3selectedUrl Tff7b72= Te6edf3configTb4b4b4.Te6edf3localUri Tff7b72?: Te6edf3configTb4b4b4.Te6edf3urlTemplate
Tff7b72if Tb4b4b4(Te6edf3currentTileProvider Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72=Tff7b72= Te6edf3selectedUrlTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3currentTileProvider
Tb4b4b4}

T8b949e// Close previous if it was a local provider
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3newProvider Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3isLocalTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3uri Tff7b72= Te6edf3UriTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3configTb4b4b4.Te6edf3localUriTb4b4b4)
Tff7b72val Te6edf3file Tff7b72=
Tff7b72try Tb4b4b4{
Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3FileTb4b4b4(Te6edf3uriTb4b4b4.Te6edf3path Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MBTilesProviderTb4b4b4(Te6edf3fileTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffLocal MBTiles file does not exist: Tffd700${Te6edf3configTb4b4b4.Te6edf3localUriTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3urlString Tff7b72= Te6edf3configTb4b4b4.Te6edf3urlTemplate
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3urlStringTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)
Tb4b4b4.Te6edf3eTb4b4b4(Ta5d6ff"Ta5d6ffTile URL does not contain valid {x}, {y}, and {z} placeholders: Tffd700$Te6edf3urlStringTa5d6ff"Tb4b4b4)
Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72object Tb4b4b4: T56d364UrlTileProviderTb4b4b4(Te6edf3TILE_SIZETb4b4b4, Te6edf3TILE_SIZETb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetTileUrlTb4b4b4(Te6edf3xTb4b4b4: Tffa657IntTb4b4b4, Te6edf3yTb4b4b4: Tffa657IntTb4b4b4, Te6edf3zoomTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3URL? Tb4b4b4{
Tff7b72val Te6edf3subdomains Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3subdomain Tff7b72= Te6edf3subdomainsTff7b72[Tb4b4b4(Te6edf3x Tff7b72+ Te6edf3yTb4b4b4) Tff7b72% Te6edf3subdomainsTb4b4b4.Te6edf3sizeTff7b72]
Tff7b72val Te6edf3formattedUrl Tff7b72=
Te6edf3urlString
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{s}Ta5d6ff"Tb4b4b4, Te6edf3subdomainTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3zoomTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3xTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3yTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72return Tff7b72try Tb4b4b4{
Te6edf3URLTb4b4b4(Te6edf3formattedUrlTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3MalformedURLExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffMalformed URL: Tffd700$Te6edf3formattedUrlTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3currentTileProvider Tff7b72= Te6edf3newProvider
Tff7b72return Te6edf3newProvider
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffisValidTileUrlTemplateTb4b4b4(Te6edf3urlTemplateTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{z}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{x}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72&Tff7b72&
Te6edf3urlTemplateTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff{y}Ta5d6ff"Tb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4)

T8b949e/** Imported overlay layers; owned by the flavor-neutral [MapLayersManager] and rendered by [MapLayerOverlay]. */
Tff7b72val Te6edf3mapLayersTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3MapLayerItemTff7b72>Tff7b72> Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3mapLayers

Tff7b72init Tb4b4b4{
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3savedCamera Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3cameraPositionTb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3savedCamera Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3FitNodes
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3savedCameraTb4b4b4.Te6edf3toCameraPositionTb4b4b4(Tb4b4b4)
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3Restored
Tb4b4b4}
Tb4b4b4}

Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3customTileProviderRepositoryTb4b4b4.Te6edf3getCustomTileProvidersTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3firstTb4b4b4(Tb4b4b4)
Te6edf3loadPersistedMapTypeTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3selectedWaypointIdTb4b4b4.Te6edf3valueTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3wpId Tff7b72-Tff7b72>
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Tff7b72val Te6edf3wpMap Tff7b72= Te6edf3waypointsTb4b4b4.Te6edf3first Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3containsKeyTb4b4b4(Te6edf3wpIdTb4b4b4) Tb4b4b4}
Te6edf3wpMapTff7b72[Te6edf3wpIdTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72>
Tff7b72val Te6edf3waypoint Tff7b72= Te6edf3packetTb4b4b4.Te6edf3waypointTff7b72!!
Tff7b72val Te6edf3latLng Tff7b72= Te6edf3LatLngTb4b4b4(Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3latitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4, Tb4b4b4(Te6edf3waypointTb4b4b4.Te6edf3longitude_i Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72/ T79c0ff1Te6edf3e7Tb4b4b4)
Te6edf3cameraPositionStateTb4b4b4.Te6edf3position Tff7b72= Te6edf3CameraPositionTb4b4b4.Te6edf3fromLatLngZoomTb4b4b4(Te6edf3latLngTb4b4b4, T79c0ff1T79c0ff5fTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffsaveCameraPositionTb4b4b4(Te6edf3cameraPositionTb4b4b4: Te6edf3CameraPositionTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72!Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3RestoredTb4b4b4) Tff7b72return
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setCameraPositionTb4b4b4(Te6edf3cameraPositionTb4b4b4.Te6edf3toMapCameraPositionTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffonInitialNodeBoundsAppliedTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_cameraInitializationTb4b4b4.Te6edf3value Tff7b72= Te6edf3CameraInitializationTb4b4b4.Te6edf3Restored
Te6edf3saveCameraPositionTb4b4b4(Te6edf3cameraPositionStateTb4b4b4.Te6edf3positionTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffloadPersistedMapTypeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3savedCustomUrl Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedCustomTileUrlTb4b4b4.Te6edf3value
Tff7b72if Tb4b4b4(Te6edf3savedCustomUrl Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
T8b949e// Check if this custom provider still exists
Tff7b72if Tb4b4b4(
Te6edf3customTileProviderConfigsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3urlTemplate Tff7b72=Tff7b72= Te6edf3savedCustomUrl Tb4b4b4} Tff7b72&Tff7b72&
Te6edf3isValidTileUrlTemplateTb4b4b4(Te6edf3savedCustomUrlTb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3_selectedCustomTileProviderUrlTb4b4b4.Te6edf3value Tff7b72= Te6edf3savedCustomUrl
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72=
Te6edf3MapTypeTb4b4b4.Te6edf3NONE T8b949e// MapType.NONE to hide google basemap when using custom provider
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// The saved custom URL is no longer valid or doesn't exist, remove preference
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedCustomTileUrlTb4b4b4(Tff7b72nullTb4b4b4)
T8b949e// Fallback to default Google Map type
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3savedGoogleMapTypeName Tff7b72= Te6edf3googleMapsPrefsTb4b4b4.Te6edf3selectedGoogleMapTypeTb4b4b4.Te6edf3value
Tff7b72try Tb4b4b4{
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3valueOfTb4b4b4(Te6edf3savedGoogleMapTypeName Tff7b72?: Te6edf3MapTypeTb4b4b4.Te6edf3NORMALTb4b4b4.Te6edf3nameTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IllegalArgumentExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffInvalid saved Google Map type: Tffd700$Te6edf3savedGoogleMapTypeNameTa5d6ff" Tb4b4b4}
Te6edf3_selectedGoogleMapTypeTb4b4b4.Te6edf3value Tff7b72= Te6edf3MapTypeTb4b4b4.Te6edf3NORMAL T8b949e// Fallback in case of invalid stored name
Te6edf3googleMapsPrefsTb4b4b4.Te6edf3setSelectedGoogleMapTypeTb4b4b4(Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddMapLayerTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3addMapLayerTb4b4b4(Te6edf3uriTb4b4b4, Te6edf3fileNameTb4b4b4)

Tff7b72fun Td2a8ffaddNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3mapLayersManagerTb4b4b4.Te6edf3addNetworkMapLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3urlTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3error Tff7b72-Tff7b72>
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3_errorFlowTb4b4b4.Te6edf3emitTb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffcopyFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4, Te6edf3fileNameTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Uri? Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3inputStream Tff7b72= Te6edf3applicationTb4b4b4.Te6edf3contentResolverTb4b4b4.Te6edf3openInputStreamTb4b4b4(Te6edf3uriTb4b4b4)
Tff7b72val Te6edf3directory Tff7b72= Te6edf3FileTb4b4b4(Te6edf3applicationTb4b4b4.Te6edf3filesDirTb4b4b4, Ta5d6ff"Ta5d6ffmap_layersTa5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3directoryTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3directoryTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3outputFile Tff7b72= Te6edf3FileTb4b4b4(Te6edf3directoryTb4b4b4, Te6edf3fileNameTb4b4b4)
Tff7b72val Te6edf3outputStream Tff7b72= Te6edf3FileOutputStreamTb4b4b4(Te6edf3outputFileTb4b4b4)

Te6edf3inputStreamTff7b72?.Te6edf3use Tb4b4b4{ Te6edf3input Tff7b72-Tff7b72> Te6edf3outputStreamTb4b4b4.Te6edf3use Tb4b4b4{ Te6edf3output Tff7b72-Tff7b72> Te6edf3inputTb4b4b4.Te6edf3copyToTb4b4b4(Te6edf3outputTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3UriTb4b4b4.Te6edf3fromFileTb4b4b4(Te6edf3outputFileTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3IOExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError copying file to internal storageTa5d6ff" Tb4b4b4}
Tff7b72null
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffaddGeoJsonLayerTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3geoJsonTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3addGeoJsonLayerTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3geoJsonTb4b4b4)

Tff7b72fun Td2a8fftoggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3toggleLayerVisibilityTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffremoveMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3removeMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffrefreshMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4: Tffa657StringTb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3refreshMapLayerTb4b4b4(Te6edf3layerIdTb4b4b4)

Tff7b72fun Td2a8ffrefreshAllVisibleNetworkLayersTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3mapLayersManagerTb4b4b4.Te6edf3refreshAllVisibleNetworkLayersTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffdeleteFileToInternalStorageTb4b4b4(Te6edf3uriTb4b4b4: Te6edf3UriTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72val Te6edf3file Tff7b72= Te6edf3uriTb4b4b4.Te6edf3toFileTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3fileTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fileTb4b4b4.Te6edf3deleteTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3ExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3withTagTb4b4b4(Ta5d6ff"Ta5d6ffMapViewModelTa5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3eTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffError deleting file from internal storageTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72suspend Tff7b72fun Td2a8ffgetInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4: Te6edf3MapLayerItemTb4b4b4)Tb4b4b4: Te6edf3InputStream? Tff7b72=
Te6edf3mapLayersManagerTb4b4b4.Te6edf3getInputStreamFromUriTb4b4b4(Te6edf3layerItemTb4b4b4)

Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3currentTileProvider Tff7b72as? Te6edf3MBTilesProviderTb4b4b4)Tff7b72?.Te6edf3closeTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657String?Tb4b4b4) Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3getUserTb4b4b4(Te6edf3userId Tff7b72?: Te6edf3NodeAddressTb4b4b4.Te6edf3ID_BROADCASTTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3GoogleCameraPositionTb4b4b4.Td2a8fftoCameraPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3CameraPositionTb4b4b4(Te6edf3LatLngTb4b4b4(Te6edf3targetLatTb4b4b4, Te6edf3targetLngTb4b4b4)Tb4b4b4, Te6edf3zoomTb4b4b4, Te6edf3tiltTb4b4b4, Te6edf3bearingTb4b4b4)

Tff7b72private Tff7b72fun Te6edf3CameraPositionTb4b4b4.Td2a8fftoMapCameraPositionTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3GoogleCameraPositionTb4b4b4(
Te6edf3targetLat Tff7b72= Te6edf3targetTb4b4b4.Te6edf3latitudeTb4b4b4,
Te6edf3targetLng Tff7b72= Te6edf3targetTb4b4b4.Te6edf3longitudeTb4b4b4,
Te6edf3zoom Tff7b72= Te6edf3zoomTb4b4b4,
Te6edf3tilt Tff7b72= Te6edf3tiltTb4b4b4,
Te6edf3bearing Tff7b72= Te6edf3bearingTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.14s